/*
* @(#)ArrowTip.java 5.1
*
*/
package CH.ifa.draw.figures;
import java.awt.Graphics;
import java.awt.Polygon;
import java.io.IOException;
import CH.ifa.draw.util.StorableInput;
import CH.ifa.draw.util.StorableOutput;
/**
* An arrow tip line decoration.
* @see PolyLineFigure
*/
public class ArrowTip implements LineDecoration {
private double fAngle; // pointiness of arrow
private double fOuterRadius;
private double fInnerRadius;
/*
* Serialization support.
*/
private static final long serialVersionUID = -3459171428373823638L;
private int arrowTipSerializedDataVersion = 1;
public ArrowTip() {
fAngle = 0.40;//0.35;
fOuterRadius = 8;//15;
fInnerRadius = 8;//12;
}
/**
* Constructs an arrow tip with the given angle and radius.
*/
public ArrowTip(double angle, double outerRadius, double innerRadius) {
fAngle = angle;
fOuterRadius = outerRadius;
fInnerRadius = innerRadius;
}
/**
* Draws the arrow tip in the direction specified by the given two
* points..
*/
public void draw(Graphics g, int x1, int y1, int x2, int y2) {
// TBD: reuse the Polygon object
Polygon p = outline(x1, y1, x2, y2);
g.fillPolygon(p.xpoints, p.ypoints, p.npoints);
}
/**
* Calculates the outline of an arrow tip.
*/
public Polygon outline(int x1, int y1, int x2, int y2) {
double dir = Math.PI/2 - Math.atan2(x2-x1, y1-y2);
return outline(x1, y1, dir);
}
private Polygon outline(int x, int y, double direction) {
Polygon shape = new Polygon();
shape.addPoint(x, y);
addPointRelative(shape, x, y, fOuterRadius, direction - fAngle);
addPointRelative(shape, x, y, fInnerRadius, direction);
addPointRelative(shape, x, y, fOuterRadius, direction + fAngle);
shape.addPoint(x,y); // Closing the polygon (TEG 97-04-23)
return shape;
}
private void addPointRelative(Polygon shape, int x, int y, double radius, double angle) {
shape.addPoint(
x + (int) (radius * Math.cos(angle)),
y - (int) (radius * Math.sin(angle)));
}
/**
* Stores the arrow tip to a StorableOutput.
*/
public void write(StorableOutput dw) {
}
/**
* Reads the arrow tip from a StorableInput.
*/
public void read(StorableInput dr) throws IOException {
}
}